home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 22 / CU Amiga Magazine's Super CD-ROM 22 (1998)(EMAP Images)(GB)[!][issue 1998-05].iso / PowerPC / Programming / PPCASMPK / emuldemo / ppctest.asm < prev    next >
Encoding:
Assembly Source File  |  1997-04-27  |  28.2 KB  |  897 lines

  1. ; This is a demo for the PPCASMPK PowerPC-emulator
  2. ; It requires at least Kickstart3.0 and AGA(or gfxboard)
  3. ;
  4. ;
  5. ;NOTE: This demo does not use absolute addressings like "ba".
  6. ;      Yet, this would be possible without relocating the code
  7. ;      because the emulator simulates the first instruction to
  8. ;      reside at address 0. So if you jump to the correct offset,
  9. ;      you can use "ba" or address local data without referring to
  10. ;      a known "base-address" like is done here.
  11. ;
  12. ;-----------------------------------------------------------------------------
  13.         cpu     mpc601
  14. ;-----------------------------------------------------------------------------
  15. ;AS 1.41r4 assembles code for BigEndian-mode,yet data-declarations
  16. ;are done LittleEndian or sometimes completely wrong.So this demo
  17. ;uses immediate-value instructions instead
  18. ;
  19. ;another bug of that assembler: the "spr" field at mtspr/mfspr instructions 
  20. ;is supposed to be a split field in assemblers,where the value you specify
  21. ;in the source is split into 2 5bit-halves and these are swapped...at AS
  22. ;they are not swapped!
  23.  
  24. ASBUGS  equ     1       ;remove define if bug-free assembler is used
  25.  
  26.  
  27.  
  28. ;;;;BO-field at conditional branches
  29. BO_true   equ     12        ;if bit=1
  30. BO_false  equ     4         ;if bit=0
  31. BO_always equ     0b10100   ;unconditional
  32. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  33.  
  34. ;;;;L-Bit at compare-instructions
  35. L_32bit   equ     0
  36. L_64bit   equ     1 ;(64bit-PPCs only)
  37. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  38.  
  39. ;;;;spr-field at mtspr/mfspr
  40.         ifdef ASBUGS
  41. SPR_XER   equ     0x20
  42. SPR_LR    equ     0x100
  43. SPR_CTR   equ     0x120
  44.         endif
  45.         ifndef ASBUGS
  46. SPR_XER   equ     1
  47. SPR_LR    equ     8
  48. SPR_CTR   equ     9
  49.         endif
  50. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  51.  
  52. crf_lt    equ     0
  53. crf_gt    equ     1
  54. crf_eq    equ     2
  55. crf_so    equ     3
  56.  
  57. ;;;;condition-register fields;;;;
  58. CR0       equ     0
  59. CR1       equ     1
  60. CR2       equ     2
  61. CR3       equ     3
  62. CR4       equ     4
  63. CR5       equ     5
  64. CR6       equ     6
  65. CR7       equ     7
  66. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  67. ;-----------------------------------------------------------------------------
  68.         INCLUDE intui.lvo
  69.         INCLUDE exec.lvo
  70.         INCLUDE graphics.lvo
  71.         INCLUDE input.lvo
  72. ;-----------------------------------------------------------------------------
  73. MYSCREEN_WIDTH  equ     320
  74. MYSCREEN_HEIGHT equ     200
  75. MYSCREEN_DEPTH  equ     8
  76. MYSCREEN_BARHEIGHT equ  11
  77. ;-----------------------------------------------------------------------------
  78. ;*** (STARTUP:)
  79. ;*** stack:            r31        
  80. ;*** return address:   LR
  81. ;*** execbase(mapped): r0
  82. ;***
  83. ;*** (INTERNAL:)
  84. ;*** base-address:     r15
  85. StartAdr:        
  86.  
  87.         mfspr r1,SPR_LR         ;save LR to r1
  88.         bl BaseAdr              ;get the base-adr to LR
  89. BaseAdr:        ;local memory is addressed relative to this address
  90.         mfspr r15,SPR_LR        ;r15=base-adr
  91.         stw r1,MainReturnAdr-BaseAdr(r15)       ;store the return-adr
  92.  
  93.         stw r0,ExecBase-BaseAdr(r15)            ;store the execbase
  94.  
  95.         
  96.         ;"intuition.library",0
  97.         addi r24,r15,IntuitionName-BaseAdr-1
  98.         addi r16,r0,'i'
  99.                 stbu r16,1(r24)
  100.         addi r16,r0,'n'
  101.                 stbu r16,1(r24)        
  102.         addi r16,r0,'t'
  103.                 stbu r16,1(r24)        
  104.         addi r16,r0,'u'        
  105.                 stbu r16,1(r24)        
  106.         addi r16,r0,'i'
  107.                 stbu r16,1(r24)        
  108.         addi r16,r0,'t'
  109.                 stbu r16,1(r24)        
  110.         addi r16,r0,'i'
  111.                 stbu r16,1(r24)        
  112.         addi r16,r0,'o'
  113.                 stbu r16,1(r24)        
  114.         addi r16,r0,'n'
  115.                 stbu r16,1(r24)        
  116.         addi r16,r0,'.'
  117.                 stbu r16,1(r24)        
  118.         addi r16,r0,'l'
  119.                 stbu r16,1(r24)        
  120.         addi r16,r0,'i'
  121.                 stbu r16,1(r24)        
  122.         addi r16,r0,'b'
  123.                 stbu r16,1(r24)        
  124.         addi r16,r0,'r'
  125.                 stbu r16,1(r24)        
  126.         addi r16,r0,'a'
  127.                 stbu r16,1(r24)        
  128.         addi r16,r0,'r'        
  129.                 stbu r16,1(r24)        
  130.         addi r16,r0,'y'
  131.                 stbu r16,1(r24)        
  132.         addi r16,r0,0
  133.                 stbu r16,1(r24)
  134.  
  135.         ;library = OpenLibrary(libName, version)
  136.         ;d0                    a1       d0
  137.         ;---------------------------------------
  138.         addi r16,r0,0 ;r0|0               ;d0
  139.         addi r25,r15,IntuitionName-BaseAdr;a1
  140.         addi r0,r0,( 1<<(31-25) )|2       ;input-mask: map a1&a6
  141.         addi r1,r0,1<<(31-16)             ;output-mask: map d0
  142.         rlwinm r1,r1,0,16,31              ;clear the upper halveword
  143.         lwz r30,ExecBase-BaseAdr(r15)
  144.         lwz r2,_LVOOpenLibrary+2(r30)
  145.         sc                                ;call it
  146.         cmpi CR0,L_32bit,r16,0
  147.         bc BO_true,crf_eq,ERROR_NoIntuition
  148.         stw r16,IntuitionBase-BaseAdr(r15)
  149.  
  150.         
  151.         ;"graphics.library",0
  152.         addi r24,r15,GraphicsName-BaseAdr-1
  153.         addi r16,r0,'g'
  154.                 stbu r16,1(r24)
  155.         addi r16,r0,'r'
  156.                 stbu r16,1(r24)        
  157.         addi r16,r0,'a'
  158.                 stbu r16,1(r24)        
  159.         addi r16,r0,'p'
  160.                 stbu r16,1(r24)        
  161.         addi r16,r0,'h'
  162.                 stbu r16,1(r24)        
  163.         addi r16,r0,'i'
  164.                 stbu r16,1(r24)        
  165.         addi r16,r0,'c'
  166.                 stbu r16,1(r24)        
  167.         addi r16,r0,'s'
  168.                 stbu r16,1(r24)        
  169.         addi r16,r0,'.'
  170.                 stbu r16,1(r24)        
  171.         addi r16,r0,'l'
  172.                 stbu r16,1(r24)        
  173.         addi r16,r0,'i'
  174.                 stbu r16,1(r24)        
  175.         addi r16,r0,'b'        
  176.                 stbu r16,1(r24)        
  177.         addi r16,r0,'r'        
  178.                 stbu r16,1(r24)        
  179.         addi r16,r0,'a'        
  180.                 stbu r16,1(r24)        
  181.         addi r16,r0,'r'        
  182.                 stbu r16,1(r24)        
  183.         addi r16,r0,'y'        
  184.                 stbu r16,1(r24)        
  185.         addi r16,r0,0        
  186.                 stbu r16,1(r24)   
  187.         
  188.  
  189.         ;library = OpenLibrary(libName, version)
  190.         ;d0                    a1       d0
  191.         ;---------------------------------------
  192.         addi r16,r0,0 ;r0 meaning 0       ;d0
  193.         addi r25,r15,GraphicsName-BaseAdr ;a1
  194.         addi r0,r0,( 1<<(31-25) )|2       ;input-mask: map a1&a6
  195.         addi r1,r0,1<<(31-16)             ;output-mask: map d0
  196.         rlwinm r1,r1,0,16,31              ;clear the upper halveword
  197.         lwz r30,ExecBase-BaseAdr(r15)
  198.         lwz r2,_LVOOpenLibrary+2(r30)
  199.         sc                                ;call it
  200.         cmpi CR0,L_32bit,r16,0
  201.         bc BO_true,crf_eq,ERROR_NoGraphics
  202.         stw r16,GraphicsBase-BaseAdr(r15)
  203.  
  204.         
  205.         
  206.         ;"input.device",0        
  207.         addi r1,r15,InputName-BaseAdr-1
  208.         addi r0,r0,'i'
  209.                 stbu r0,1(r1)
  210.         addi r0,r0,'n'
  211.                 stbu r0,1(r1)
  212.         addi r0,r0,'p'
  213.                 stbu r0,1(r1)
  214.         addi r0,r0,'u'
  215.                 stbu r0,1(r1)
  216.         addi r0,r0,'t'
  217.                 stbu r0,1(r1)
  218.         addi r0,r0,'.'
  219.                 stbu r0,1(r1)
  220.         addi r0,r0,'d'
  221.                 stbu r0,1(r1)
  222.         addi r0,r0,'e'
  223.                 stbu r0,1(r1)
  224.         addi r0,r0,'v'
  225.                 stbu r0,1(r1)
  226.         addi r0,r0,'i'
  227.                 stbu r0,1(r1)
  228.         addi r0,r0,'c'
  229.                 stbu r0,1(r1)
  230.         addi r0,r0,'e'
  231.                 stbu r0,1(r1)
  232.         addi r0,r0,0
  233.                 stbu r0,1(r1)
  234.  
  235.         ;error = OpenDevice(devName, unitNumber, iORequest, flags)
  236.         ;d0                 a0       d0          a1         d1
  237.         ;---------------------------------------------------------
  238.         addi r24,r15,InputName-BaseAdr  ;a0
  239.         addi r16,r0,0                   ;d0
  240.         addi r25,r15,InputIOReq-BaseAdr ;a1
  241.         addi r17,r0,0                   ;d1
  242.         addi r0,r0,( 1<<(31-24) )|( 1<<(31-25) )|2 ;input-mask: map a0/a1/a6
  243.         addi r1,r0,0                    ;no output-mappings
  244.         lwz r30,ExecBase-BaseAdr(r15)
  245.         lwz r2,_LVOOpenDevice+2(r30)
  246.         sc
  247.         cmpi CR0,L_32bit,r16,0  ;OpenDevice returns 0 for success
  248.         bc BO_false,crf_eq,ERROR_NoInput
  249.  
  250.         ;get the Input-Base mapped
  251.         lwz r17,InputIOReq-BaseAdr+MN_SIZE(r15)
  252.         addi r0,r0,0
  253.         addi r1,r0,1<<(31-17)   ;map from Amiga to PPC-address space
  254.         addi r2,r0,0    ;just do the mapping
  255.         sc
  256.         stw r17,InputBase-BaseAdr(r15)
  257.  
  258.         ;prepare the Screen-Title
  259.         addi r1,r15,MyScreenTitle-BaseAdr-1
  260.         addi r0,r0,'P'
  261.                 stbu r0,1(r1)
  262.         addi r0,r0,'P'
  263.                 stbu r0,1(r1)
  264.         addi r0,r0,'C'
  265.                 stbu r0,1(r1)
  266.         addi r0,r0,'-'
  267.                 stbu r0,1(r1)
  268.         addi r0,r0,'E'
  269.                 stbu r0,1(r1)
  270.         addi r0,r0,'m'
  271.                 stbu r0,1(r1)
  272.         addi r0,r0,'u'
  273.                 stbu r0,1(r1)
  274.         addi r0,r0,'l'
  275.                 stbu r0,1(r1)
  276.         addi r0,r0,'a'
  277.                 stbu r0,1(r1)
  278.         addi r0,r0,'t'
  279.                 stbu r0,1(r1)
  280.         addi r0,r0,'o'
  281.                 stbu r0,1(r1)
  282.         addi r0,r0,'r'
  283.                 stbu r0,1(r1)
  284.         addi r0,r0,' '
  285.                 stbu r0,1(r1)
  286.         addi r0,r0,'D'
  287.                 stbu r0,1(r1)
  288.         addi r0,r0,'e'
  289.                 stbu r0,1(r1)
  290.         addi r0,r0,'m'
  291.                 stbu r0,1(r1)
  292.         addi r0,r0,'o'
  293.                 stbu r0,1(r1)
  294.         addi r0,r0,'('
  295.                 stbu r0,1(r1)
  296.         addi r0,r0,'L'
  297.                 stbu r0,1(r1)
  298.         addi r0,r0,'M'
  299.                 stbu r0,1(r1)
  300.         addi r0,r0,'B'
  301.                 stbu r0,1(r1)
  302.         addi r0,r0,' '
  303.                 stbu r0,1(r1)
  304.         addi r0,r0,'t'
  305.                 stbu r0,1(r1)
  306.         addi r0,r0,'o'
  307.                 stbu r0,1(r1)
  308.         addi r0,r0,' '
  309.                 stbu r0,1(r1)
  310.         addi r0,r0,'q'
  311.                 stbu r0,1(r1)
  312.         addi r0,r0,'u'
  313.                 stbu r0,1(r1)
  314.         addi r0,r0,'i'
  315.                 stbu r0,1(r1)
  316.         addi r0,r0,'t'
  317.                 stbu r0,1(r1)
  318.         addi r0,r0,')'
  319.                 stbu r0,1(r1)
  320.         addi r0,r0,0
  321.                 stbu r0,1(r1)
  322.  
  323.         ;map the Title-address
  324.         addi r16,r15,MyScreenTitle-BaseAdr
  325.         addi r2,r0,0    ;no call
  326.         addi r0,r0,1<<(31-16) ;map r16
  327.         rlwinm r0,r0,0,16,31          ;clear the upper halveword        
  328.         addi r1,r0,0    ;no address mapping to PPC-address space
  329.         sc
  330.  
  331.         ;setup the NewScreen-structure        
  332.         addi r1,r15,MY_NewScreen-BaseAdr
  333.         addi r0,r0,0
  334.         sth r0,MY_ns_LeftEdge-MY_NewScreen(r1)
  335.         addi r0,r0,0
  336.         sth r0,MY_ns_TopEdge-MY_NewScreen(r1)
  337.         addi r0,r0,MYSCREEN_WIDTH
  338.         sth r0,MY_ns_Width-MY_NewScreen(r1)
  339.         addi r0,r0,MYSCREEN_HEIGHT+MYSCREEN_BARHEIGHT
  340.         sth r0,MY_ns_Height-MY_NewScreen(r1)
  341.         addi r0,r0,MYSCREEN_DEPTH
  342.         sth r0,MY_ns_Depth-MY_NewScreen(r1)
  343.         addi r0,r0,1
  344.         stb r0,MY_ns_DetailPen-MY_NewScreen(r1)
  345.         addi r0,r0,1
  346.         stb r0,MY_ns_BlockPen-MY_NewScreen(r1)
  347.         addi r0,r0,V_SPRITES
  348.         sth r0,MY_ns_ViewModes-MY_NewScreen(r1)
  349.         addi r0,r0,CUSTOMSCREEN
  350.         sth r0,MY_ns_Type-MY_NewScreen(r1)
  351.         addi r0,r0,0
  352.         stw r0,MY_ns_Font-MY_NewScreen(r1)
  353.         addi r0,r0,0
  354.         stw r16,MY_ns_DefaultTitle-MY_NewScreen(r1) ;use the mapped adr
  355.         stw r0,MY_ns_Gadgets-MY_NewScreen(r1)
  356.         addi r0,r0,0
  357.         stw r0,MY_ns_CustomBitmap-MY_NewScreen(r1)
  358.  
  359.  
  360.         ;Screen = OpenScreen( NewScreen )
  361.         ;d0                   a0
  362.         ;--------------------------------
  363.         addi r24,r15,MY_NewScreen-BaseAdr ;a1
  364.         addi r0,r0,( 1<<(31-24) )|2   ;input:map a1+a6
  365.         addi r1,r0,1<<(31-16)         ;output:map d0
  366.         rlwinm r1,r1,0,16,31          ;clear the upper halveword
  367.         lwz r30,IntuitionBase-BaseAdr(r15)
  368.         lwz r2,_LVOOpenScreen+2(r30)
  369.         sc
  370.         cmpi CR0,L_32bit,r16,0
  371.         bc BO_true,crf_eq,ERROR_NoScreen
  372.         stw r16,MyScreen-BaseAdr(r15)   ;store our screen
  373.  
  374.  
  375.         ;** allocates temporary rastport for WritePixelArray8
  376.         ;** input:  r17=original Rastport
  377.         ;**         r15=Base-Address
  378.         ;** return: r16=0 if success/r16=1 if out of ChipMem
  379.         ;**         (in BOTH cases call FreePlanes to free allocated chipmem)
  380.         ;** altered: r0-r2/r16-r30
  381.         lwz r17,MyScreen-BaseAdr(r15)
  382.         addi r17,r17,sc_RastPort
  383.         bl SetupTempRastport
  384.         cmpi CR0,L_32bit,r16,0
  385.         bc BO_false,crf_eq,ERROR_NoTmpRP
  386.       
  387.  
  388.         ;alloc the chunky buffer
  389.  
  390.         ;memoryblock = AllocMem(byteSize, attributes)
  391.         ;d0                     d0        d1
  392.         ;--------------------------------------------
  393.         addi r0,r0,2            ;input:map a6
  394.         addi r1,r0,1<<(31-16)   ;output:map d0
  395.         rlwinm r1,r1,0,16,31    ;clear the upper 16 bits
  396.         addi r16,r0,0xffff&(MYSCREEN_WIDTH*(MYSCREEN_HEIGHT+2))
  397.         rlwinm r16,r16,0,16,31  ;clear the upper 16 bits
  398.         addis r16,r16,0xffff&((MYSCREEN_WIDTH*(MYSCREEN_HEIGHT+2))>>16)
  399.         stw r16,ChunkyBufSize-BaseAdr(r15)
  400.         addi r17,r0,0           ;d1
  401.         addis r17,r17,1 ;clear it
  402.         lwz r30,ExecBase-BaseAdr(r15)
  403.         lwz r2,_LVOAllocMem+2(r30)
  404.         sc
  405.         cmpi CR0,L_32bit,r16,0
  406.         bc BO_true,crf_eq,ERROR_NoChunkyBuf
  407.         stw r16,ChunkyBufAdr-BaseAdr(r15)       ;store adr of chunky buffer
  408.  
  409.         ;;;wait for left mousebutton to be pressed;;;
  410. WaitForMouse:
  411.         
  412.         ;***work with the chunky-buffer***
  413.         bl DoChunky
  414.  
  415.         ;***display the chunky-buffer***
  416.         
  417.         ;count = WritePixelArray8(rp,xstart,ystart,xstop,ystop,array,temprp)
  418.         ;d0                       a0 d0     d1     d2    d3    a2    a1
  419.         ;-------------------------------------------------------------------
  420.         lwz r24,MyScreen-BaseAdr(r15)
  421.         addi r24,r24,sc_RastPort                ;a0
  422.         addi r25,r15,TmpRastport-BaseAdr        ;a1
  423.         lwz r26,ChunkyBufAdr-BaseAdr(r15)       ;a2
  424.         addi r16,r0,0                           ;d0
  425.         addi r17,r0,0+MYSCREEN_BARHEIGHT        ;d1
  426.         addi r18,r0,MYSCREEN_WIDTH-1            ;d2
  427.         addi r19,r0,MYSCREEN_HEIGHT-1+MYSCREEN_BARHEIGHT   ;d3
  428.         addi r0,r0,(1<<(31-24))|(1<<(31-25))|(1<<(31-26))|2  ;map a0/a1/a2/a6
  429.         addi r1,r0,0
  430.         lwz r30,GraphicsBase-BaseAdr(r15)
  431.         lwz r2,_LVOWritePixelArray8+2(r30)
  432.         sc
  433.  
  434.  
  435.         ;qualifier = PeekQualifier()
  436.         ;d0
  437.         ;---------------------------
  438.         addi r0,r0,2    ;map a6
  439.         addi r1,r0,0    ;no output-mappings
  440.         lwz r30,InputBase-BaseAdr(r15)
  441.         lwz r2,_LVOPeekQualifier+2(r30)
  442.         sc
  443.  
  444.         andi. r16,r16,IEQUALIFIER_LEFTBUTTON
  445.         bc BO_true,crf_eq,WaitForMouse
  446.         ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  447.  
  448.  
  449.  
  450.  
  451.         ;FreeMem(memoryBlock, byteSize)
  452.         ;        a1           d0
  453.         ;------------------------------
  454.         lwz r25,ChunkyBufAdr-BaseAdr(r15)       ;a1
  455.         lwz r16,ChunkyBufSize-BaseAdr(r15)      ;d0
  456.         addi r0,r0,( 1<<(31-25) )|2             ;map a1/a6
  457.         addi r1,r0,0
  458.         lwz r30,ExecBase-BaseAdr(r15)
  459.         lwz r2,_LVOFreeMem+2(r30)
  460.         sc
  461.  
  462. ERROR_NoChunkyBuf:
  463.  
  464. ERROR_NoTmpRP:
  465.         ;** frees the (partially) allocated bitplanes for the temporary rastport
  466.         ;** input: r15=base-address
  467.         ;** altered: r0-r2/r16-r30
  468.         bl FreePlanes
  469.  
  470.  
  471.         ;CloseScreen( Screen )
  472.         ;             a0
  473.         ;---------------------
  474.         lwz r24,MyScreen-BaseAdr(r15)
  475.         addi r0,r0,(1<<(31-24))|2       ;map a0&a6
  476.         addi r1,r0,0                    ;output:map nothing
  477.         lwz r30,IntuitionBase-BaseAdr(r15)   ;execbase in a6
  478.         lwz r2,_LVOCloseScreen+2(r30)   ;the address to jump to
  479.         sc
  480.  
  481. ERROR_NoScreen:
  482.  
  483.  
  484.  
  485.         ;CloseDevice(iORequest)
  486.         ;            a1
  487.         ;----------------------
  488.         addi r25,r15,InputIOReq-BaseAdr ;a1
  489.         addi r0,r0,( 1<<(31-25) )|2     ;map a1&a6
  490.         addi r1,r0,0                    ;no output-mappings
  491.         lwz r30,ExecBase-BaseAdr(r15)
  492.         lwz r2,_LVOCloseDevice+2(r30)
  493.         sc
  494.  
  495.  
  496. ERROR_NoInput:
  497.         
  498.         ;CloseLibrary(library)
  499.         ;             a1
  500.         ;---------------------
  501.         lwz r25,GraphicsBase-BaseAdr(r15)
  502.         addi r0,r0,(1<<(31-25))|2    ;map a1&a6
  503.         addi r1,r0,0    ;no output-mappings
  504.         lwz r30,ExecBase-BaseAdr(r15)   ;execbase in A6
  505.         lwz r2,_LVOCloseLibrary+2(r30)
  506.         sc
  507.  
  508.  
  509. ERROR_NoGraphics:
  510.  
  511.         ;CloseLibrary(library)
  512.         ;             a1
  513.         ;---------------------
  514.         lwz r25,IntuitionBase-BaseAdr(r15)
  515.         addi r0,r0,(1<<(31-25))|2    ;map a1&a6
  516.         addi r1,r0,0    ;no output-mappings
  517.         lwz r30,ExecBase-BaseAdr(r15)   ;execbase in A6
  518.         lwz r2,_LVOCloseLibrary+2(r30)
  519.         sc
  520.  
  521. ERROR_NoIntuition:
  522.  
  523.         lwz r0,MainReturnAdr-BaseAdr(r15)       ;restore the return-adr
  524.         mtspr SPR_LR,r0
  525.         bclr BO_always,0        ;RETURN 
  526. ;# # # # # # # # # # # # # # # # # # # # # # #
  527. ;;;;;Routines;;;;;;
  528.  
  529. ;** r16....target
  530. ;** r17....source
  531. ;** r18....size
  532. ;**altered: r16,r17,r18,r19
  533. ByteCopy:
  534.         addi r16,r16,-1
  535.         addi r17,r17,-1
  536.  
  537.         ByteCopy_loop:
  538.         cmpi CR0,L_32bit,r18,0  ;copied all bytes?
  539.         bclr BO_true,crf_eq     ;then return
  540.  
  541.         addi r18,r18,-1
  542.  
  543.         lbzu r19,1(r17)
  544.         stbu r19,1(r16)
  545.  
  546.         b ByteCopy_loop
  547.  
  548. ; ; ; ; ; ; ; ; ; ;
  549.  
  550. ;** allocates temporary rastport for WritePixelArray8
  551. ;** input:  r17=original Rastport
  552. ;**         r15=Base-Address
  553. ;** return: r16=0 if success/r16=1 if out of ChipMem
  554. ;**         (in BOTH cases call FreePlanes to free allocated chipmem)
  555. ;** altered: r0-r2/r16-r30
  556. SetupTempRastport:
  557.         mfspr r16,SPR_LR
  558.         stwu r16,-4(r31)        ;save LR onto the stack
  559.  
  560.      ;1.copy the rastport structure
  561.         ;** r16....target
  562.         ;** r17....source
  563.         ;** r18....size
  564.         ;**altered: r16,r17,r18,r19
  565.         addi r16,r15,TmpRastport-BaseAdr
  566.         addi r18,r18,rp_SIZEOF
  567.         bl ByteCopy
  568.      
  569.      ;2.set Layer=NULL
  570.         addi r16,r15,TmpRastport-BaseAdr        ;r16=new rastport
  571.         addi r17,r0,0
  572.         stw r17,rp_Layer(r16)
  573.  
  574.      ;3.setup a new Bitmap
  575.         addi r17,r15,TmpBitmap-BaseAdr
  576.         addi r0,r0,1<<(31-17)   ;map it first
  577.         addi r1,r0,0
  578.         addi r2,r0,0    ;no call
  579.         sc
  580.         stw r17,rp_BitMap(r16)
  581.  
  582.         ;InitBitMap( bm, depth, width, height )
  583.         ;            a0  d0     d1     d2
  584.         ;--------------------------------------
  585.         addi r24,r15,TmpBitmap-BaseAdr  ;a0
  586.         addi r16,r0,MYSCREEN_DEPTH      ;d0
  587.         addi r17,r0,MYSCREEN_WIDTH      ;d1
  588.         addi r18,r0,MYSCREEN_HEIGHT+MYSCREEN_BARHEIGHT     ;d2
  589.         addi r0,r0,( 1<<(31-24) )|2     ;map a0&a6
  590.         addi r1,r0,0
  591.         lwz r30,GraphicsBase-BaseAdr(r15)
  592.         lwz r2,_LVOInitBitMap+2(r30)
  593.         sc
  594.  
  595.         addi r16,r15,TmpBitmap-BaseAdr ;r16=new bitmap
  596.         ;__set rows=1
  597.         addi r17,r0,1
  598.         sth r17,bm_Rows(r16)
  599.         ;__set BytesPerRow
  600.         addi r17,r0,(MYSCREEN_WIDTH>>3)
  601.         sth r17,bm_BytesPerRow(r16)
  602.  
  603.      ;4.allocate the bitplanes
  604.         addi r16,r15,TmpBitmap-BaseAdr+bm_Planes-4 ;point to planes-4
  605.         addi r17,r0,MYSCREEN_DEPTH
  606.  
  607.         SetupTempRastport_allocplanes:
  608.         cmpi CR0,L_32bit,r17,0  ;all planes done?
  609.         bc BO_true,crf_eq,SetupTempRastport_success
  610.         addi r17,r17,-1
  611.  
  612.         stwu r16,-4(r31)        ;save r16 to the stack
  613.         stwu r17,-4(r31)        ;save r17 to the stack
  614.  
  615.         ;planeptr = AllocRaster( width, height )
  616.         ;d0                      d0     d1
  617.         ;---------------------------------------
  618.         addi r16,r0,MYSCREEN_WIDTH        ;d0
  619.         addi r17,r0,MYSCREEN_HEIGHT+MYSCREEN_BARHEIGHT+2     ;d1
  620.         addi r0,r0,2    ;map a6
  621.         addi r1,r0,0    ;no output-adrs
  622.         lwz r30,GraphicsBase-BaseAdr(r15)
  623.         lwz r2,_LVOAllocRaster+2(r30)
  624.         sc
  625.         ori r18,r16,0           ;move the adr to r18
  626.  
  627.         lwz r17,(r31)           ;restore r17 from the stack
  628.         lwzu r16,4(r31)         ;restore r16 from the stack
  629.         addi r31,r31,4
  630.  
  631.         stwu r18,4(r16)
  632.         cmpi CR0,L_32bit,r18,0  ;out of ChipMem?
  633.         bc BO_false,crf_eq,SetupTempRastport_allocplanes
  634.  
  635.         ;;failed! caller should free allocated planes with FreePlanes
  636.         addi r16,r0,1           ;indicate failure
  637.         b SetupTempRastport_quit
  638.         
  639.         SetupTempRastport_success:
  640.         addi r16,r0,0           ;indicate success
  641.         SetupTempRastport_quit:
  642.         lwz r17,(r31)   ;restore LR from the stack
  643.         addi r31,r31,4
  644.         mtspr SPR_LR,r17
  645.         bclr BO_always,0        ;return
  646. ; ; ; ; ; ; ; ; ; ;
  647. ;** frees the (partially) allocated bitplanes for the temporary rastport
  648. ;** input: r15=base-address
  649. ;** altered: r0-r2/r16-r30
  650. FreePlanes:
  651.  
  652.         addi r16,r15,TmpBitmap-BaseAdr+bm_Planes-4      ;point to planes-4
  653.         addi r17,r0,MYSCREEN_DEPTH
  654.  
  655.         FreePlanes_loop:
  656.         cmpi CR0,L_32bit,r17,0  ;freed all?
  657.         bc BO_true,crf_eq,FreePlanes_done
  658.         addi r17,r17,-1
  659.  
  660.         lwzu r24,4(r16)
  661.         cmpi CR0,L_32bit,r24,0  ;no more allocated planes?
  662.         bc BO_true,crf_eq,FreePlanes_done
  663.  
  664.         stwu r16,-4(r31) ;push to stack
  665.         stwu r17,-4(r31) ;push to stack
  666.  
  667.         ;FreeRaster( p, width, height )
  668.         ;           a0  d0     d1
  669.         addi r16,r0,MYSCREEN_WIDTH        ;d0
  670.         addi r17,r0,MYSCREEN_HEIGHT+MYSCREEN_BARHEIGHT+2     ;d1
  671.         addi r0,r0,2   ;map a6 ;no mapping of a0 needed
  672.         addi r1,r0,0
  673.         lwz r30,GraphicsBase-BaseAdr(r15)
  674.         lwz r2,_LVOFreeRaster+2(r30)
  675.         sc
  676.  
  677.         lwz r17,(r31)   ;pop from stack
  678.         lwzu r16,4(r31)  ;pop from stack
  679.         addi r31,r31,4
  680.  
  681.         b FreePlanes_loop
  682.  
  683.         FreePlanes_done:
  684.         bclr BO_always,0        ;return
  685.  
  686.  
  687. TmpBitmap:db bm_SIZEOF dup (0)  ;bitplanes here remain in Amiga-address space
  688.         align 4
  689. TmpRastport:db rp_SIZEOF dup (0)
  690.         align 4
  691. ; ; ; ; ; ; ; ; ; ;
  692. ;** does the chunky graphic
  693. DoChunky:
  694.         mfspr r0,SPR_LR
  695.         stwu r0,-4(r31)         ;save the return-address onto the stack
  696.         
  697.         ;;clear the buffer        
  698. ;WritePixelArray8 clears the buffer itself
  699. ;        lwz r1,ChunkyBufSize-BaseAdr(r15)
  700. ;        addi r2,r0,0
  701. ;        lwz r3,ChunkyBufAdr-BaseAdr(r15)
  702. ;        addi r3,r3,-4
  703. ;        DoChunky_clear:
  704. ;        stwu r2,4(r3)
  705. ;        addi r1,r1,-4
  706. ;        cmpi CR0,L_32bit,r1,0
  707. ;        bc BO_false,crf_eq,DoChunky_clear
  708.  
  709.  
  710.         ;;do some moving graphics
  711.         
  712.         lwz r1,DoChunky_counter-BaseAdr(r15)
  713.         addi r1,r1,2
  714.         lwz r2,DoChunky_xy-BaseAdr(r15)
  715.         cmpi CR0,L_32bit,r2,0
  716.         bc BO_true,crf_eq,DoChunky_xmode
  717.         
  718.         addi r17,r0,0                   ;x1        
  719.         subfic r18,r1,MYSCREEN_HEIGHT-1 ;y1
  720.         addi r19,r0,MYSCREEN_WIDTH-1    ;x2
  721.         or r20,r1,r1                    ;y2
  722.  
  723.         cmpi CR0,L_32bit,r1,MYSCREEN_HEIGHT-1
  724.         bc BO_true,crf_lt,DoChunky_ymode_notyet
  725.         xori r2,r2,1
  726.         stw r2,DoChunky_xy-BaseAdr(r15)
  727.         addi r1,r0,0    ;counter to zero
  728.         DoChunky_ymode_notyet:
  729.  
  730.         b DoChunky_set
  731.  
  732.         DoChunky_xmode:
  733.         or r17,r1,r1                    ;x1
  734.         addi r18,r0,0                   ;y1
  735.         subfic r19,r1,MYSCREEN_WIDTH-1  ;x2
  736.         addi r20,r0,MYSCREEN_HEIGHT-1   ;y2
  737.         
  738.         cmpi CR0,L_32bit,r1,MYSCREEN_WIDTH-1
  739.         bc BO_true,crf_lt,DoChunky_xmode_notyet
  740.         xori r2,r2,1
  741.         stw r2,DoChunky_xy-BaseAdr(r15)
  742.         addi r1,r0,0    ;counter to zero
  743.         DoChunky_xmode_notyet:
  744.         
  745.         DoChunky_set:
  746.         stw r1,DoChunky_counter-BaseAdr(r15)
  747.  
  748.         lwz r16,ChunkyBufAdr-BaseAdr(r15)       ;buffer
  749.         addi r21,r0,10                          ;color
  750.         addi r22,r0,MYSCREEN_WIDTH              ;buffer width
  751.         bl DrawChunkyLine
  752.  
  753.         lwz r0,0(r31)   ;restore LR from the stack
  754.         addi r31,r31,4
  755.         mtspr SPR_LR,r0
  756.         bclr BO_always,0        ;return
  757. DoChunky_xy:dd 0  ;0/1
  758. DoChunky_counter:dd 0
  759.  
  760. ; ; ; ; ; ; ; ; ;
  761. ;** r16....Chunky-Buffer
  762. ;** r17....x-start
  763. ;** r18....y-start
  764. ;** r19....x-stop
  765. ;** r20....y-stop
  766. ;** r21....color(in lower 8 bits)
  767. ;** r22....buffer width
  768. ;** altered: r16-r30
  769. DrawChunkyLine:
  770.  
  771.         mullw r30,r18,r22      ;y-offset
  772.         add r30,r30,r17         ;x-offset
  773.         add r16,r30,r16         ;r16:address of start-pixel
  774.  
  775.         addi r25,r0,1           ;r25:y-stepping
  776.         addi r26,r0,1           ;r26:x-stepping
  777.  
  778.         subf. r30,r17,r19                               ;x2-x1
  779.         or r28,r30,r30                                  ;r28:dx
  780.         bc BO_false,crf_lt,DrawChunkyLine_dxpositive
  781.         neg r30,r30
  782.         neg r26,r26
  783.         DrawChunkyLine_dxpositive:
  784.  
  785.         subf. r29,r18,r20                               ;y2-y1
  786.         or r27,r29,r29                                  ;r27:dy
  787.         bc BO_true,crf_gt,DrawChunkyLine_dypositive
  788.         bc BO_false,crf_eq,DrawChunkyLine_dynegative
  789.         cmpi CR0,L_32bit,r30,0                          ;startpixel=endpixel?
  790.         bc BO_true,crf_eq,DrawChunkyLine_onepixel
  791.         DrawChunkyLine_dynegative:
  792.         neg r29,r29
  793.         neg r25,r25
  794.         DrawChunkyLine_dypositive:
  795.  
  796.         
  797.         cmp CR0,L_32bit,r29,r30         ;abs(dy) > abs(dx) ?
  798.         bc BO_true,crf_gt,DrawChunkyLine_ymode
  799.  
  800.         rlwinm r27,r27,8,0,31-8 ;r27:dy*256
  801.         divw r27,r27,r30        ;r27:(dy*256)/abs(dx)
  802.         addi r25,r0,0           ;r25:y-offset
  803.  
  804.         add r28,r26,r28         ;abs(r28):number of pixels
  805.         DrawChunkyLine_xloop:
  806.  
  807.         srawi r29,r25,8
  808.         addze r29,r29           ;/256
  809.         mullw r29,r29,r22       ;*bufferwidth
  810.         stbx r21,r29,r16        ;set one pixel
  811.  
  812.         add r25,r25,r27         ;add to y-offset
  813.  
  814.         add r16,r16,r26         ;step in x-direction
  815.         subf. r28,r26,r28       ;count the pixels
  816.         bc BO_false,crf_eq,DrawChunkyLine_xloop
  817.  
  818.         bclr BO_always,0        ;return
  819.  
  820. DrawChunkyLine_onepixel:
  821.  
  822.         stb r21,0(r16)
  823.         bclr BO_always,0        ;return
  824.  
  825. DrawChunkyLine_ymode:
  826.  
  827.         rlwinm r28,r28,8,0,31-8 ;r28:dx*256
  828.         divw r28,r28,r29        ;r28:(dx*256)/abs(dy)
  829.         addi r26,r0,0           ;r26:x-offset
  830.  
  831.         mullw r29,r25,r22       ;r29:y-stepping*bufferwidth
  832.         add r27,r25,r27         ;abs(r27):number of pixels
  833.         DrawChunkyLine_yloop:
  834.  
  835.         srawi r30,r26,8
  836.         addze r30,r30           ;/256
  837.         stbx r21,r30,r16
  838.  
  839.         add r26,r28,r26         ;add to x-offset
  840.  
  841.         add r16,r16,r29         ;step in y-direction
  842.         subf. r27,r25,r27
  843.         bc BO_false,crf_eq,DrawChunkyLine_yloop
  844.  
  845.         bclr BO_always,0        ;return
  846.  
  847. ;# # # # # # # # # # # # # # # # # # # # # # #
  848. MainReturnAdr:dd 0
  849. ExecBase:dd 0
  850. IntuitionBase:dd 0
  851. GraphicsBase:dd 0        
  852. InputBase:dd 0
  853. MyScreen:dd 0
  854.  
  855. ChunkyBufAdr:dd 0
  856. ChunkyBufSize:dd 0
  857.         align 4
  858.                 
  859. MY_NewScreen:        
  860. MY_ns_LeftEdge: dw 0
  861. MY_ns_TopEdge:  dw 0
  862. MY_ns_Width:    dw 0
  863. MY_ns_Height:   dw 0
  864. MY_ns_Depth:    dw 0
  865. MY_ns_DetailPen:db 0
  866. MY_ns_BlockPen: db 0
  867. MY_ns_ViewModes:dw 0
  868. MY_ns_Type:     dw 0
  869. MY_ns_Font:     dd 0
  870. MY_ns_DefaultTitle:dd 0
  871. MY_ns_Gadgets:  dd 0
  872. MY_ns_CustomBitmap:dd 0
  873.         align 4
  874.  
  875.  
  876. InputIOReq:db 400 dup (0)
  877.         align 4
  878.  
  879.  
  880.  
  881.  
  882.  
  883.  
  884.  
  885.                 ;"intuition.library",0
  886. IntuitionName:db "xxxxxxxxxxxxxxxxxxXXXX"
  887.                ;"graphics.library",0
  888. GraphicsName:db "xxxxxxxxxxxxxxxxxXXXX"        
  889.             ;"input.device",0
  890. InputName:db "xxxxxxxxxxxxxXXXX"                
  891.  
  892. MyScreenTitle:db "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"        
  893.         align 4
  894.  
  895. ;-----------------------------------------------------------------------------
  896.  
  897.